package com.projectCommon.util.commonUtil;

import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

import javax.imageio.ImageIO;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @date 2024/04/06/16:49
 * @target 心若有所向往，何惧道阻且长
 */
//包括一些文件格式转换的工具类
public class FileUtil {
    /**
     * 返回excel 转图片的之后的一个byte数组
     *
     * @param excelByte
     * @param jpgFileName
     * @return
     */
    public static byte[] excelToPic(byte[] excelByte, String jpgFileName) {

        byte[] picByte = new byte[0];
        //加载Excel工作表
        Workbook wb = new Workbook();
        wb.loadFromStream(new ByteArrayInputStream(excelByte));
        Worksheet sheet = wb.getWorksheets().get(0);

        String path = FileUtil.class.getClassLoader().getResource(jpgFileName).getPath();
        sheet.saveToImage(path);
        try {
            FileInputStream fis = new FileInputStream(new File(path));
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
            }
            picByte = bos.toByteArray();
            fis.close();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return picByte;
    }

    public static ByteArrayOutputStream excel2Pic(InputStream fileInputStream) throws IOException {
        return excel2Pic(fileInputStream, FileType.ImageType.PNG, 0);
    }

    public static ByteArrayOutputStream excel2Pic(InputStream fileInputStream, FileType.ImageType IMAGETYPE, int sheetNum) throws IOException {
        Workbook wb = new Workbook();
        long l = System.currentTimeMillis();
        wb.loadFromStream(fileInputStream);
        long l1 = System.currentTimeMillis();
        System.out.println("加载excel文件耗时： " + (l1 - l));
        //获取工作表
        Worksheet sheet = wb.getWorksheets().get(sheetNum);
        long start = System.currentTimeMillis();
        //调用方法将Excel工作表保存为图片
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(sheet.toImage(1, 1, sheet.getLastRow(), sheet.getLastColumn()), IMAGETYPE.name(), byteArrayOutputStream);
        long end = System.currentTimeMillis();
        System.out.println("excel转图片耗时：" + (end - start));
        return byteArrayOutputStream;
    }

    /**
     * @param resourceFileName 传入的直接是resource文件目录下的路径以及名称
     * @return 返回这个文件的byte数组
     */
    public static byte[] getResourceFileByte(String resourceFileName) {
        InputStream inputStream = getResourceInputStream(resourceFileName);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
            }
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                inputStream.close();
                byteArrayOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @param resourceFileName 传入的直接是resource文件目录下的路径以及名称
     * @return 返回这个文件的File对象
     */
    public static File getResourceFile(String resourceFileName) {
        String path = FileUtil.class.getClassLoader().getResource(resourceFileName).getPath();
        return new File(path);
    }

    /**
     * 得到资源文件中的流对象 调用方式为 eg: template/list.xls
     * @param resourceFileName 资源文件的路径
     * @return 返回流对象
     */
    public static InputStream getResourceInputStream(String resourceFileName){
        return FileUtil.class.getClassLoader().getResourceAsStream(resourceFileName);
    }


    public static byte[] getNullResourceFileByte() {
        byte[] resourceFileByte = getResourceFileByte("tempFile/null.jpg");
        return resourceFileByte;
    }

    /**
     * 排除后缀得到名字
     *
     * @param fileName
     * @return
     */
    public static String getFileNameExcludeSuffix(String fileName) {
        if (fileName == null) {
            throw new RuntimeException("传入的文件名字为空");
        }
        int i = fileName.lastIndexOf(".");
        return i > 0 ? fileName.substring(0, i) : fileName;
    }


    /**
     * 得到一个资源文件的字符串集合
     * @param resourceFilePath 资源文件路径
     * @return 返回一个字符串集合，一行一条数据
     */
    public static List<String> getResourceFileToStrList(String resourceFilePath){
        String file = Objects.requireNonNull(FileUtil.class.getClassLoader().getResource(resourceFilePath)).getFile();
        // 创建一个 List 集合来存储文件中的每一行
        List<String> linesList = new ArrayList<>();
        // 使用 try-with-resources 语句自动关闭资源
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            // 逐行读取文件内容
            String line;
            while ((line = br.readLine()) != null) {
                // 添加读取到的行到 List 集合中
                linesList.add(line);
            }
        } catch (IOException e) {
            // 处理异常，例如文件不存在或读取错误
            e.printStackTrace();
        }
        return linesList;
    }
}
